//
//  main.m
//  OC03_数组,字典,集合
//
//  Created by Hanlingyu on 16/7/6.
//  Copyright © 2016年 ltq. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    
#pragma mark - 数组
    
    // 1. 数组: 可变数组 与 不可变数组
    // 数组主要是有序的存放元素的集合类型, 并且可以通过下标取值
    // 注: 数组中只能存放对象类型
    // 不可变数组    只能取值
    // 可变数组      可以进行增, 删, 改的操作
    
    // 一. 不可变数组
    // 2. 初始化数组
    
    // <1> initWithObjects 后面填入的参数一定是对象类型
    //     可变参数 C语言中的链表(后续讲)
    NSArray *array = [[NSArray alloc] initWithObjects:@"123", nil, @"345", @"456", @"567", nil];
    NSLog(@"%@", array);
    // <2> 构造器方法
    NSArray *arr = [NSArray arrayWithObjects:@"123", nil, @"345", @"456", @"567", nil];
    // <3> 字面量 同NSString @"" NSNumber @()
    //           NSArray @[]
//    NSObject *objc = nil;
//    NSArray *myArray = @[@"123", objc, @"345", @"456", @"567"];
//    NSLog(@"%@", myArray);
    
    // 三种初始化方式推荐使用字面量, 字面量可以识别对象是否为空值, 但一般的初始化方法不可以
    // 如果为空, 字面量会崩溃  -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]'
    // 但是, 初始化方法会识别nil为结束, 并不会产生问题, 造成数据丢失.
    
    // 3. 取值相关
    //    <1> count 取得数组中元素个数
    NSLog(@"%ld", array.count);
    //    <2> 数组中取值, 通过下标去取值
    NSString *numberString = [array objectAtIndex:0];
    //    <3> 语法糖 取值方式 快捷取值
    NSString *numberStr = array[0];
    //    <4> 根据值去取对应下标
    NSUInteger indexOfObject = [array indexOfObject:@"123"];
    NSLog(@"%ld", indexOfObject);
    //    <5> 判断对象是否存在于数组中
    BOOL isHaveObject = [array containsObject:@"123"];
    NSLog(@"%@", isHaveObject ? @"YES" : @"NO");  // 三目运算符
    //    <6> 取数组中第0位/最后一个元素(如果数组为空, 返回的对象为空, 并且不会崩溃)
    [array firstObject];
    [array lastObject];
    
    // 4. 不可变数组, 改变元素(会生成新的数组, 不会再原数组基础上修改)
    //    <1> 数组添加一个新的元素
    array = [array arrayByAddingObject:@"234"];
    NSLog(@"%@", array);
    //    <2> 数组添加另外一个数组中的所有元素
    array = [array arrayByAddingObjectsFromArray:arr];
    NSLog(@"array = %@", array);
    
    // 二. 可变数组  NSMutableArray
    // 1. 初始化方法, 同不可变数组
    // 如果遇到可变数组, 只能使用初始化方法或者便利构造器
    NSMutableArray *mutableArray = [NSMutableArray array];
    // 字面量创建方法, 不推荐使用
//    NSMutableArray *mutableArray = [@[] mutableCopy];
    // 2. 取值方式与不可变数组一样
    // 3. 可变元素
    //    <1> 数组中添加元素
    [mutableArray addObject:@"123"];
    //    <2> 数组中在相应位置插入元素
    [mutableArray insertObject:@"含蓄" atIndex:0];
    NSLog(@"%@", mutableArray);
    //    <3> 移除
//    [mutableArray removeObjectAtIndex:0];// 移除第0个元素
//    [mutableArray removeAllObjects];// 移除所有元素
//    [mutableArray removeLastObject];// 移除最后一个元素
    //    <4> 替换 (使用替换时, 数组对应位置不能为空)
    [mutableArray replaceObjectAtIndex:0 withObject:@"韩旭"];
    
    // 可变 与 不可变的区别
    // 1. 可变是可以修改的, 但不可变类型不能修改.
    // 2. 不可变调用改变的方法时, 会生成新的对象; 可变调用改变的方法时, 在对象本身上进行修改
    // 3. 可变继承于不可变
    
    
    // 将字符串根据某个子串, 截取成数组
    // 根据哪个子串截取, 哪个子串会消失
    NSString *urlString = @"www.a123cb.com";
    NSArray *urlArray = [urlString componentsSeparatedByString:@"."];
    NSLog(@"utlArray: %@", urlArray);
    
    // 根据某个字符串, 把数组中的元素拼接成一个字符串
    NSArray *nameArray = @[@"韩旭", @"隔壁老黄"];
    NSString *nameString = [nameArray componentsJoinedByString:@"&"];
    NSLog(@"nameString: %@", nameString);
    
    
    
    return 0;
}
